// http.ts
import axios from "axios";
const showStatus = status => {
  let message = "";
  switch (status) {
    case 400:
      message = "请求错误(400)";
      break;
    case 401:
      message = "未授权，请重新登录(401)";
      break;
    case 403:
      message = "拒绝访问(403)";
      break;
    case 404:
      message = "请求出错(404)";
      break;
    case 408:
      message = "请求超时(408)";
      break;
    case 500:
      message = "服务器错误(500)";
      break;
    case 501:
      message = "服务未实现(501)";
      break;
    case 502:
      message = "网络错误(502)";
      break;
    case 503:
      message = "服务不可用(503)";
      break;
    case 504:
      message = "网络超时(504)";
      break;
    case 505:
      message = "HTTP版本不受支持(505)";
      break;
    default:
      message = `连接出错(${status})!`;
  }
  return `${message}，请检查网络或联系管理员！`;
};

const service = axios.create({
  // 联调
  baseURL: "/api",
  headers: {
    "Content-Type": "application/json;charset=utf-8"
  },
  // 是否跨站点访问控制请求
  withCredentials: true,
  timeout: 30000,

  validateStatus() {
    // 使用async-await，处理reject情况较为繁琐，所以全部返回resolve，在业务代码中处理异常
    return true;
  }
});

// 请求拦截器
service.interceptors.request.use(
  config => {
    config.data = JSON.stringify(config.data);
    config.headers.token = window.sessionStorage.getItem("token");
    return config;
  },
  error => {
    // 错误抛到业务代码
    error.data = {};
    error.data.msg = "服务器异常，请联系管理员！";
    return Promise.resolve(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  response => {
    const status = response.status;
    let msg = "";
    if (status < 200 || status >= 300) {
      // 处理http错误，抛到业务代码
      msg = showStatus(status);
      if (typeof response.data === "string") {
        response.data = { data: { msg } };
      } else {
        response.data.msg = msg;
      }
    }
    return response;
  },
  error => {
    // 错误抛到业务代码
    error.data = {};
    error.data.msg = "请求超时或服务器异常，请检查网络或联系管理员！";
    return Promise.resolve(error);
  }
);

// 封装请求函数
export const $http = {
  get(url = "", params = {}) {
    return new Promise((resolve, reject) => {
      service({
        url,
        params,
        method: "GET"
      })
        .then(res => {
          resolve(res.data);
          return res;
        })
        .catch(error => {
          reject(error);
        });
    });
  },
  post(url = "", params = {}) {
    return new Promise((resolve, reject) => {
      service({
        url,
        data: params,
        method: "POST"
      })
        .then(res => {
          resolve(res.data);
          return res;
        })
        .catch(error => {
          reject(error);
        });
    });
  },
  put(url = "", params = {}) {
    return new Promise((resolve, reject) => {
      service({
        url,
        data: params,
        method: "put"
      })
        .then(res => {
          resolve(res.data);
          return res;
        })
        .catch(error => {
          reject(error);
        });
    });
  },
  delete(url = "", params = {}) {
    return new Promise((resolve, reject) => {
      service({
        url,
        data: params,
        method: "delete"
      })
        .then(res => {
          resolve(res.data);
          return res;
        })
        .catch(error => {
          reject(error);
        });
    });
  }
};
